package com.example.myapplication

import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.blankj.utilcode.util.LogUtils
import com.wakeup.sdk.ble.WeikeBleMgr
import com.wakeup.sdk.ble.ext.EventType
import com.wakeup.sdk.ble.ext.OnEventListener

class GptExampleActivity : AppCompatActivity() {
    private val TAG = "GptExampleActivity"

    // 使用方，自己写好id和模板问题
    private val questionModel = arrayListOf("如何预防感冒？", "如何预防生病？", "如何强身健体？")

    class NoteEntity(
        val id: Int,
        val memoTime: Long,
        val memoTitle: String,
        val memoContent: String
    )

    // 使用方，自己缓存好的备忘录id和模板问题
    private val noteModel = arrayListOf<NoteEntity>()

    private val callback = object : OnEventListener {
        override fun onEvent(type: EventType, code: Int, data: Any?) {
            if (type == EventType.TYPE_CHAT_GPT) {
                LogUtils.i(TAG, "code $code ,data $data")
                if (code == 0) { // 0 手表请求模板问题信息
                    WeikeBleMgr.sendTemplateQuestion(0, questionModel[0])
                    return
                }
                if (code == 1) { // 1 手表点击模板问题
                    if (data !is Int) {
                        LogUtils.i(TAG, ">> 类型不对")
                        return
                    }
                    sendHealth(data)
                    return
                }
                if (code == 2) { // 2 手表发送提问参数
                    if (data !is Pair<*, *>) {
                        LogUtils.i(TAG, ">> 类型不对")
                        return
                    }
                    val content = (data as Pair<Int, String>)
                    content.first
                    return
                }
                if (code == 3) { // 3 手表重新提问
                    send()
                    return
                }
                return
            }
            if (type == EventType.TYPE_RECORD_AUDIO) { // 设备控制录音
                if (code != 0) {// 0 是gpt的录音回调
                    return
                }
                LogUtils.i(TAG, ">>>TYPE_RECORD_AUDIO data $data")
                when (data) {
                    0 -> LogUtils.i(TAG, ">>>TYPE_RECORD_AUDIO 开始录音")

                    1 -> {
                        LogUtils.i(TAG, ">>>TYPE_RECORD_AUDIO 结束录音")
                        send()
                    }
                    2 -> LogUtils.i(TAG, ">>>TYPE_RECORD_AUDIO 重新录制")
                    3 -> LogUtils.i(TAG, ">>>TYPE_RECORD_AUDIO 取消录制")
                }
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_gpt)
        for (index in 0..3) {
            val bean = NoteEntity(
                index,
                ((System.currentTimeMillis() + index * 3600000) / 1000), // 不可重复时间
                "备忘录标题$index",
                "备忘录内容$index"
            )
            noteModel.add(bean)
        }
        findViewById<Button>(R.id.btn_start).setOnClickListener {
            // 每次同步备忘录需要 先调用 WeikeBleMgr.clearGptTodo() 清除设备内备忘录数据
            WeikeBleMgr.clearGptTodo()

            // 发送GPT备忘录
            for (index in noteModel) {
                WeikeBleMgr.sendGptTodo(
                    index.id,
                    index.memoTime,
                    index.memoTitle,
                    index.memoContent
                )
            }
        }
        // 增加设备录音、使用gpt功能，监听回调
        WeikeBleMgr.registerListener(callback, EventType.TYPE_CHAT_GPT, EventType.TYPE_RECORD_AUDIO)
    }

    private fun send() {
        // 结束录音，需要将录音文件转成文字，返回给手表
        val question = "因为中国人不骗中国人。"
        for (index in question.indices) {
            if (index == question.length - 1) { // 内容的最后一次，结束包
                WeikeBleMgr.sendQuestion(1, question[index].toString(), 1, 0)
            } else {
                // 发过程包
                WeikeBleMgr.sendQuestion(1, question[index].toString(), 0, 0)
            }
        }
        // 注意：提问内容结束后，需要再回复 1次 提问发送结束
        WeikeBleMgr.sendQuestion(1, "", 2, 0)

        // 注意：需要先进行将提问内容，缓存起来。用于gpt服务器接口传参
        // 待gpt回复后，将内容可以回复给设备显示
        val answer = "因为中国人不骗中国人。"
        for (index in answer.indices) {
            if (index == answer.length - 1) { // 内容的最后一次，结束包
                WeikeBleMgr.sendResult(1, answer[index].toString(), 1, 0)
            } else {
                // 发过程包
                WeikeBleMgr.sendResult(1, answer[index].toString(), 0, 0)
            }
        }

        // 注意：回复内容结束后，需要再回复 1次 回答结束
        WeikeBleMgr.sendResult(1, "", 2, 0)
    }

    private fun sendHealth(position: Int) {
        // 结束录音，需要将录音文件转成文字，返回给手表
        val question = questionModel[position]
        for (index in question.indices) {
            if (index == question.length - 1) { // 内容的最后一次，结束包
                WeikeBleMgr.sendQuestion(1, question[index].toString(), 1, 0)
            } else {
                // 发过程包
                WeikeBleMgr.sendQuestion(1, question[index].toString(), 0, 0)
            }
        }
        // 注意：提问内容结束后，需要再回复 1次 提问发送结束
        WeikeBleMgr.sendQuestion(1, "", 2, 0)

        // 注意：需要先进行将提问内容，缓存起来。用于gpt服务器接口传参
        // 待gpt回复后，将内容可以回复给设备显示
        val answer = "以上主要把与手表设备交互流程给出示例。具体使用还请阅读sdk文档，来根据需求定制实现"
        for (index in answer.indices) {
            if (index == answer.length - 1) { // 内容的最后一次，结束包
                WeikeBleMgr.sendResult(1, answer[index].toString(), 1, 0)
            } else {
                // 发过程包
                WeikeBleMgr.sendResult(1, answer[index].toString(), 0, 0)
            }
        }

        // 注意：回复内容结束后，需要再回复 1次 回答结束
        WeikeBleMgr.sendResult(1, "", 2, 0)
    }

    override fun onDestroy() {
        super.onDestroy()
        WeikeBleMgr.unregisterListener(callback)
    }
}
